package org.shj.pattern.command

/**
 * 命令模式： 把请求一个操作的对象与知道怎么执行一个操作的对象分割开。
 * 好处：
 *   1. 较容易设计一个命令队列
 *   2. 可以将命令记入日志
 *   3. 允许接收请求的一方决定是否要否决请求
 *   4. 容易地实现对请求的撤销和重做
 *   5. 容易新增加新的具体命令类
 *   
 * 意图： 将请求封装成一个对象，从而可以使用不同的请求对客户进行参数化
 * 主要解决： 在软件系统中，行为请求者与行为实现者通常是一种紧耦合的关系，但某些场合，比如需要对行为进行记录、
 *         撤消或重做等处理时，这种无法抵御变化的紧耦合 的设计就不太合适
 * 
 * 
 * @author huangjian
 *
 */
object CommandMain {
  def main(args: Array[String]): Unit = {
    val broker = new Broker
    
    val req = new Request
    /**
     * 根据业务需求，根据实际条件，可以实现撤销，重做等命令，客户端只需要关注具体请求
     */
    val buy = new BuyCommand(req)
    broker.addCommand(buy)
    
    val sell = new SellCommand(req)
    broker.addCommand(sell)
    
    broker.executeCommands()
  }
}